#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "itask.h"
#include "toastnotification.h"
#include "versionmanager.h"
#include "configmanager.h"
#include "updatemanager.h"
#include "updatedialog.h"
#include "systemtraymanager.h"
#include "aboutdialog.h"
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QPushButton>
#include <QFileDialog>
#include <QSplitter>
#include <QDockWidget>
#include <QTabWidget>
#include <QTabBar>
#include <QAction>
#include <QToolBar>
#include <QIcon>
#include <QMenu>
#include <QMenuBar>
#include <QPainter>
#include <QPixmap>
#include <QPolygon>
#include <QPainterPath>
#include <cmath>
#include <QSettings>
#include <QScreen>
#include <QTimer>
#include <QCloseEvent>
#include <QActionGroup>
#include <QMimeData>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QShowEvent>
#include <QTextStream>
#include <QDateTime>
#include <QHash>
#include <QDir>
#include <QStandardPaths>
#include <QCryptographicHash>
#include <QStatusBar>

namespace poppler {
    class document;
}
#include "imageprocessor.h"
#include "pageview.h"
#include "thumbnailview.h"
#include "virtualthumbnailview.h"
#include "progressdialog.h"
#include "outputsettings.h"
#include "splashscreen.h"
#include "updatechecker.h"
#include <QTranslator>
#include "customfilebrowser.h"
#include "unifiedcachemanager.h"
#include "unifiedpagerenderer.h"
#include "statusbarmanager.h"
#include "streamingexportmanager.h"
#include "processingsettings.h"
#include "settingswidget.h"
#include "systemconfigdialog.h"
#include "layoutstatemanager.h"
#include "fileidentitymanager.h"
#include "unified_memory_interfaces.h"
#include "pagerenderer.h"
#include "unifieddragdrophandler.h"
#include "configimpactdetector.h"
#include "cacherebuildmanager.h"
#include "customfilelistwidget.h"
#include "applicationstatemanager.h"
#include "apimanager.h"
#include "systemconfig.h"
#include "systemconfigmanager.h"
#include "configmanager.h"
#include "dpiservice.h"
#include "globalpagemanager.h"  // Martin Fowler重构：全局页码管理器
#include "logindialog.h"
#include "userinfodialog.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow, public IProgressObserver
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
    
    // 导出状态检查
    bool hasFilesForExport() const;
    
    // 统一导航意图与服务
    enum class NavigationIntent { FromVirtualThumbnail, FromTraditionalThumbnail, FromMainView };
    void navigateAndHighlight(int thumbnailIndex, NavigationIntent intent);
    
    // IProgressObserver接口实现
    void onProgressUpdated(const QString& taskId, int progress, const QString& status) override;
    void onTaskCompleted(const QString& taskId) override;
    void onTaskFailed(const QString& taskId, const QString& error) override;
    void onTaskStarted(const QString& taskId) override;
    void onTaskCancelled(const QString& taskId) override;

private:
    // === 排序安全的文件状态更新方法 ===
    void updateFileStatusSafely(const QString& taskId, FileStatusIconManager::FileStatus status, int progress = 0, const QString& statusText = QString());
    void updateFileProgressSafely(const QString& taskId, int progress, const QString& statusText = QString());

public:

signals:
    void windowShown();

    // 文件处理状态变化信号
    void fileProcessingStateChanged(bool isProcessing);

protected:
    void closeEvent(QCloseEvent *event) override;
    bool event(QEvent *event) override;
    void dragEnterEvent(QDragEnterEvent* event) override;
    void dropEvent(QDropEvent* event) override;
    void showEvent(QShowEvent* event) override;
    void resizeEvent(QResizeEvent* event) override;
    void moveEvent(QMoveEvent* event) override;

private slots:
    void openImage();
    void processImage();
    void updatePageView(int index);
    void singleColumn();
    void twoColumns();
    void threeColumns();
    void showSystemConfigDialog();
    void showAboutDialog();
    void applySystemConfig(const SystemConfig& config);
    void startCacheRebuildProcess(const ConfigImpactDetector::RebuildRequirement& requirement);  // 已弃用，使用CacheRebuildManager
    void updateCurrentFileDPI();
    void rebuildAllFilesCache();  // 已弃用，使用CacheRebuildManager
    void rebuildUsingExistingPipeline();  // Martin Fowler重构：使用现有文件处理管道重建缓存
    void loadSystemConfig();  // 加载系统配置
    void saveSystemConfig();  // 保存系统配置
    void applyDockWidgetWidths();  // 延迟应用dock widget宽度
    void fitWidth();
    void fitHeight();
    void zoomIn();
    void zoomOut();
    void exportToPdf();
    
    // 包装方法，检查文件列表状态
    void safeSingleColumn();
    void safeTwoColumns();
    void safeThreeColumns();
    void safeFitWidth();
    void safeFitHeight();
    void safeZoomIn();
    void safeZoomOut();
    void showSystemLoginDialog();
    void updateLoginAction();
    void enablePremiumFeatures();
    void initializeLoginStatus();
    void checkForUpdates(bool silent = false);
    void openOnlineVersion();
    // 旧的handleUpdateAvailable方法已被onUpdateAvailable替代

    // === 版本管理 ===
    void initializeVersionInfo();
    void updateVersionDisplay();
    void updateWelcomeMessage();
    QString getWelcomeVersionMessage();
    void handleNoUpdate();
    void handleUpdateError(const QString& error);
    // 旧的downloadUpdate方法已被UpdateManager替代
    void onUpdateAvailable(const VersionManager::UpdateInfo& info);
    void showUpdateDialog(const VersionManager::UpdateInfo& info);
    void onUpdateFinished(const QString& filePath);
    void onUpdateProgress(int progress, qint64 received, qint64 total);
    void onVersionInfoReceived(const QString& latestVersion, const QString& downloadUrl, const QString& releaseNotes, const QString& md5Hash);

    // 心跳和认证错误处理
    void onTokenExpired();
    void onHeartbeatError(const QString& error);
    void onHeartbeatSuccess();
    void onDeviceNotFound();
    void onNetworkError(const QString& error);

    // 登录状态指示
    void updateLoginStatusIndicator(bool isActive);

    // === 安全防护系统 ===
    void initializeSecuritySystems();
    void handleSecurityViolation(const QString& reason);
    void handleTamperingAttempt(const QString& details);
    void handleIntegrityViolation();

    void checkLicense();
    void switchLanguage(const QString &locale);
    
    // 用户活动检测
    void notifyUserActivity();
    bool eventFilter(QObject* obj, QEvent* event) override;
    
    // 文件列表相关槽函数
    void onFileSelected(int index, const UnifiedFileInfo& file);

    // Martin Fowler重构：ApplicationStateManager集成
    void onTotalDisplayPagesChanged(int totalPages);
    void onFileRemoved(int index);

    // 状态栏相关槽函数
    void onOneClickExport();
    void onUpdateRequested();  // 更新按钮点击槽函数
    void onExportSettings();

    // 导出辅助方法
    QList<QImage> loadAllPagesForFile(const UnifiedFileInfo& fileInfo);
    QImage loadPageFromFile(const QString& filePath, int pageIndex);
    QImage loadPageFromPDF(const QString& filePath, int pageIndex);
    QImage loadPageFromImage(const QString& filePath, int pageIndex);

      
    void updateStatusBarFileInfo();
    void setStatusBarFileInfo(int currentFile, int totalFiles, const QString& fileName);
    void onFilesChanged();
    void onFilesReordered();
    void onSettingsChanged(int index, const UnifiedFileInfo& settings);
    void onExportRequested();
    void onPreviewRequested(int index, const UnifiedFileInfo& file);
    void onClearAllRequested(); // 清除所有请求
    void onResetProgramRequested(); // 重置程序请求
    
    // 状态清理方法
    void clearMemoryData();
    void clearDiskCache();
    void clearProgramStates();
    void resetUIToInitialState();

    // === Martin Fowler重构：完整的文件移除清理 ===
    void clearFileFromAllComponents(int removedIndex);

    void onLayoutModeRequested(int layoutMode); // 布局模式请求
    
    // 缓存管理
    
    // 侧边栏控制
    void toggleLeftSidebar();
    void toggleRightSidebar();
    // updateSidebarVisibility 已删除 - 不再管理停靠窗口状态

    // 窗口布局
    void setupFixedWindowLayout();
    
    // 虚拟缩略图相关
    void onThumbnailSelected(int index);
    void onThumbnailClicked(int index);
    void handleThumbnailClickInternal(int index);  // 内部处理方法
    
    // TOAST提示功能
    void showToastMessage(const QString& message) const;

  
    // 统一渲染器相关（新增）
    void onProcessingSettingsChanged(const ProcessingSettings& settings);
    void updateRenderSettings(const ProcessingSettings& settings);
    void updateStatusBarSettings(const ProcessingSettings& settings);

    // 页码实时预览相关槽函数
    void onPageNumberPositionPreviewChanged(const QPointF& position);
    void onPageNumberSettingsChanged(const ProcessingSettings::PageNumberSettings& settings);
    
    // 自动生成导出路径
    QString generateAutoExportPath() const;
    
    
public:
    // 获取文件列表（供批量处理对话框使用）
    CustomFileBrowser* getFileBrowser() const { return m_fileBrowser; }

    // 获取页面视图（供设置面板使用）
    PageView* getPageView() const { return m_pageView; }
    
    // 检查文件是否已存在
    bool isFileAlreadyAdded(const QString& filePath) const;

    // 文件处理状态访问接口（供StatusBarManager使用）
    bool isFileProcessing() const;
    
    // === 新增：拖拽重复文件处理方法 ===
    
    /**
     * 处理拖拽结果，包含重复文件处理
     * @param result 拖拽处理结果
     */
    void handleDragDropResult(const UnifiedDragDropHandler::DragDropResult& result);
    
    /**
     * 显示重复文件提示对话框
     * @param duplicateFiles 重复文件列表
     * @param duplicateMapping 重复文件映射
     */
    void showDuplicateFileNotification(const QStringList& duplicateFiles,
                                      const QHash<QString, QString>& duplicateMapping);

    // === Martin Fowler重构：全局页码连续性支持 ===

    /**
     * @brief 切换到指定文件（带页码连续性）
     * @param fileIdentity 文件唯一标识
     * @param targetPage 目标页码（可选，如果为空则跳转到文件起始页）
     */
    void switchToFileWithContinuousPaging(const QString& fileIdentity, const QString& targetPage = QString());

    /**
     * @brief 处理全局页码变化
     * @param globalPage 新的全局页码
     */
    void onGlobalPageChanged(int globalPage);

    /**
     * @brief 处理页码映射变化（文件排序后）
     */
    void onPageMappingsChanged();
    
    // 统一页面加载和显示系统
    // loadPagesFromCacheOrGenerate 已移除，现在使用统一的缓存加载
    void updateViewsWithPages(const QList<QImage>& pages);
    void updateViewsWithPagesAndThumbnails(const QList<QImage>& pages, const QList<QImage>& thumbnails);
    
    // 图片处理优化方法
    int calculateImagePageCount(const QImage& image, LayoutMode mode);
    void precalculateImageSplitPositions(const QImage& image);
    QList<QImage> generateImageSlicesFromPositions(const QImage& image, int startSliceIndex, int sliceCount);
    
    // 统一的列模式切换方法
    void switchColumnMode(LayoutMode newMode, bool fromFileBrowser = false);
    
    // 文件处理状态管理（使用统一线程管理器）
    void startFileProcessing();
    void submitFileProcessingTask(int fileIndex, const QString& filePath);
    void updateProcessingStatus(); // 更新处理状态显示

    // 智能布局管理（异步Observer Pattern）
    void applySmartLayoutAfterFileProcessing(int fileIndex);
    
    // TDD: 统一内存管理方法
    void setupUnifiedMemoryManagement();
    QImage loadPageFromUnifiedCache(int pageIndex);
    void onUnifiedImageLoaded(IUnifiedMemoryManager::ContentType type, int index, const QImage& image);
    
    // 列模式同步映射
    int mapThumbnailToMainPage(int thumbnailIndex);
    int mapMainPageToThumbnail(int mainPageIndex);
    
    // 自定义同步槽函数
    void onThumbnailPageSelected(int thumbnailIndex);
    void onMainPageChanged(int mainPageIndex);
    void onPageViewThumbnailClicked(int thumbnailIndex);

    // 懒加载槽函数
    void onNeedMorePages(int startIndex, int count);
    void onNeedMoreThumbnails(int startIndex, int count); // 新增：处理缩略图动态加载请求

    // 批量文件并行缓存处理
    void processBatchFiles(const QStringList& filePaths);
    void processFileToCache(const QString& filePath, ProgressDialog* progress);
    void processPDFToCache(const QString& filePath, ProgressDialog* progress);
    void processImageToCache(const QString& filePath, ProgressDialog* progress);

    // 新的完整处理方法
    int estimatePDFPages(const QString& filePath);
    bool processCompleteFileToCache(const QString& filePath, ProgressDialog* progress, int& currentStep, int totalSteps);
    bool processCompletePDFToCache(const QString& filePath, ProgressDialog* progress, int& currentStep, int totalSteps);
    bool processCompleteImageToCache(const QString& filePath, ProgressDialog* progress, int& currentStep, int totalSteps);
    void loadFileFromCache(const QString& filePath);
    
    bool loadImageFile(const QString& filePath, QImage& image);
    void debugOutput(const QString& message) const;  // 保留接口但不输出
    
    // PDF虚拟加载方法
    QImage loadPDFPage(int pageIndex);
    void addToCache(int pageIndex, const QImage& image);
    void clearPDFCache();
    void updatePDFViews();

    // 新增虚拟加载相关方法（已迁移到统一系统）

    // 自绘图标方法
    QIcon createNavigationIcon() const;
    QIcon createSettingsIcon() const;
    QIcon createInfoIcon() const;
    QIcon createSplitPanelIcon(bool leftActive = true) const;  // 创建分割面板图标

private:
    // Navigation/布局策略常量（集中管理魔数）
    static constexpr int NAVIGATE_DELAY_MS = 50;
    static constexpr int LAYOUT_RECOMPUTE_DELAY_MS = 100;
    static constexpr int PLACEHOLDER_LOAD_DELAY_MS = 200;
    static constexpr int TOAST_SHORT_MS = 3000;
    static constexpr int TOAST_MEDIUM_MS = 5000;
    static constexpr int TOAST_LONG_MS = 10000;
    ImageProcessor *m_imageProcessor;
    PageView *m_pageView;
    ThumbnailView *m_thumbnailView;
    VirtualThumbnailView *m_virtualThumbnailView;
    CustomFileBrowser *m_fileBrowser;
    QList<QImage> m_pages;
    
    // 任务管理
    QMap<QString, int> m_taskToFileIndex;  // 任务ID到文件索引的映射
    QMap<QString, QString> m_taskToFileIdentity;  // 任务ID到文件身份的映射（排序安全）
    QImage m_originalImage;
    QDockWidget *m_fileBrowserDock;  // 文件列表停靠窗口
    QDockWidget *m_thumbnailDock;    // 缩略图停靠窗口
    QTabWidget *m_rightTabs;         // 右侧标签容器
    SettingsWidget *m_settingsWidget; // 页面设置面板
    QVBoxLayout *m_mainLayout;
    QToolBar* m_mainToolBar; 
    // Actions
    QAction *m_loadAction;
    QAction *singleColumnAct;
    QAction *twoColumnsAct;
    QAction *threeColumnsAct;
    // PDF导出动作已移除 - 使用状态条一键导出替代
    QAction *m_systemConfigAction;
    QAction *m_systemLoginAction;
    QAction *m_fitWidthAction;
    QAction *m_fitHeightAction;
    QAction *m_zoomInAction;
    QAction *m_zoomOutAction;
    QAction *m_exitAction;
    QAction *m_exportAction;
    QAction *m_checkUpdateAction;
    QAction *m_aboutAction;
    
    // 新增的Action变量
    QAction *zoomInAct;
    QAction *zoomOutAct;
    QAction *importAct;
        
    
    // 侧边栏切换动作
    QAction* m_toggleLeftSidebarAction;
    QAction* m_toggleRightSidebarAction;
    
    void setupUI();
    void clearLogsOnStartup();
    void createActions();
    void createMenus();
    void createToolBar();
    void initializeStatusBar();
    bool loadSettings();
    void saveSettings();
    LayoutMode m_currentMode;
    QImage m_originalPageImage;
    
    // 日志文件
    mutable QTextStream* m_logStream; // 日志关闭（不使用）
    // UI 提示节流标志（替代局部 static，避免捕获静态变量警告）
    mutable bool m_toastShown = false;
    // 跳转高亮保护：避免 pageChanged 触发的清理逻辑立刻清除高亮
    bool m_skipClearHighlightOnce = false;
    // RAII 守卫类：作用域内设置一次性保护标志，析构时自动复位
    class HighlightGuard {
    public:
        explicit HighlightGuard(bool& flag) : ref(flag) { ref = true; }
        ~HighlightGuard() { ref = false; }
    private:
        bool& ref;
    };
    
    // PDF虚拟加载相关
    poppler::document* m_pdfDocument;
    int m_pdfPageCount;
    UnifiedCacheManager* m_cacheManager;  // 统一缓存管理器
    StatusBarManager* m_statusBarManager;  // 状态栏管理器
    ApplicationStateManager* m_appStateManager;  // 应用状态管理器 - 解决Shotgun Surgery
    StreamingExportManager* m_streamingExportManager;  // 流式导出管理器（单线程，内存友好）
    
    // TDD: 新的统一内存管理系统
    std::unique_ptr<IUnifiedMemoryManager> m_unifiedMemoryManager;
    std::unique_ptr<ICacheLoadingService> m_unifiedCacheService;
    QList<QImage> m_loadedPages;  // 内存中的页面缓存
    QList<int> m_loadedPageIndices;  // 对应的页面索引
    bool m_cancelled;  // PDF加载取消标志
    
    // 图片分割位置缓存（确保一致性）
    QList<int> m_imageSplitPositions;  // 预计算的图片分割位置

    // === 重构：配置管理系统 ===
    // Martin Fowler: Replace Magic Number with Symbolic Constant
    SystemConfig m_systemConfig;  // 系统配置实例

    // 防止重复调用loadFileFromCache的锁
    bool m_loadingFile = false;
    
    // 程序初始化完成标志
    bool m_initializationComplete = false;
    
    // 延迟设置dock widget宽度的成员变量
    int m_savedFileBrowserWidth = 0;
    int m_savedThumbnailWidth = 0;

    // === 版本更新系统 ===
    // 版本信息
    QString m_currentVersion;
    QString m_serverVersion;
    QTimer* m_versionCheckTimer;

    // 更新管理器
    UpdateManager* m_updateManager;

    // 系统托盘管理器
    SystemTrayManager* m_systemTrayManager;

    // 用户信息对话框
    UserInfoDialog* m_userInfoDialog;
    
    // 页码更新防抖定时器
    QTimer* m_pageNumberUpdateTimer = nullptr;
    QTimer* m_pageNumberPreviewTimer = nullptr;

    // === 动态配置方法 (替换硬编码常量) ===
    // 重构原则：Extract Method, Replace Magic Number
    int getMaxPagesInMemory() const { return m_systemConfig.calculateMaxPagesInMemory(); }
    int getKeepRange() const { return getMaxPagesInMemory() / 2; }  // 保持一半作为keep range
    int getPreloadRange() const { return m_systemConfig.calculatePreloadRange(); }
    double getProcessingDpi() const { return m_systemConfig.getProcessingDpi(); }
    // 预览/导出有效DPI（WYSIWYG且禁止上采样）
    // Martin Fowler重构：使用DpiService统一计算
    double getEffectiveDpi() const {
        double systemDpi = DpiSvc.getDpiForPurpose(DpiService::DpiPurpose::CacheGeneration);
        double panelDpi = DpiSvc.getDpiForPurpose(DpiService::DpiPurpose::WindowRendering);
        return qMin<double>(panelDpi, systemDpi);
    }

    // 计算A4目标预览高度（像素），基于有效DPI、窗口缩放与DPR，并通过桶量化（带回滞）
    int targetA4PreviewHeightPx(double scale = 1.0) const;
    int selectBucketHeightWithHysteresis(int desiredHeight) const;

    // Martin Fowler重构：Extract Method - DPI配置管理
    void updateImageProcessorDpiConfig();

    // Martin Fowler重构：DPI配置获取方法
    DpiConfiguration getCurrentDpiConfiguration() const;

private:
    // 桶回滞参数与状态
    mutable int m_lastBucketHeight = 0;
    static constexpr double BUCKET_HYSTERESIS_RATIO = 0.15; // 15%

    // 保留的静态常量（与配置无关的UI常量）
    // 旧常量已替换为配置驱动的方法：
    // MAX_CACHED_PAGES -> getMaxPagesInMemory()
    // INITIAL_LOAD_PAGES -> getPreloadRange()
    static const int THUMBNAIL_SIZE = 150;  // 缩略图大小

    // 智能DPI计算
    double calculateOptimalDPI(int pageCount, qint64 fileSize = 0) const;
    int dpiBucketForHeight(int pixelHeight) const;
    QString currentFileIdentity() const;  // 优先使用当前已加载文件的标识
    int findFileIndexByIdentity(const QString& fileIdentity) const;  // 通过文件标识查找索引
    void applyLayoutModeToSelectedFiles(LayoutMode mode);  // 应用布局模式到选中文件
    void loadCacheSettings();
    
    // 滚动位置管理（解决处理中滚动位置重置问题）
    void saveScrollPosition();
    void restoreScrollPosition();
    bool m_isFileProcessing = false;  // 文件是否正在处理中
    int m_savedCurrentPage = -1;     // 保存的当前页面
    QPoint m_savedScrollOffset;       // 保存的滚动偏移

    // 心跳错误计数器
    int m_heartbeatErrorCount = 0;

    // 心跳连续失败计数器（用于强制重新登录）
    int m_consecutiveHeartbeatFailures = 0;

    // 懒加载机制
    QList<QImage> loadPagesLazy(const QString& fileIdentity, int totalPages);
    QList<QImage> loadThumbnailsFromCache(const QString& fileIdentity, int totalPages);
    QList<QImage> createLayoutPlaceholders(LayoutMode layoutMode) const;
    void updateThumbnailsRealtime(const QString& fileIdentity, int progress);
    void managePagesMemory(int currentPageIndex);
    void preloadNearbyPages(int currentPage);
    void preloadForCompositeMode(int currentPage, LayoutMode mode);  // 组合页面优化预加载
    void smartPreloadPages(int currentPage);  // 智能预加载调度器
    void backgroundPreload(int currentPage);  // 后台预加载
    void idlePreload();  // 空闲时预加载
    void loadPageAsync(int pageIndex);  // 管理m_pages内存限制
    
    void createUpdateAction();
    UpdateChecker* m_updateChecker;
    ApiManager* m_apiManager;

    // 更新信息存储
    QString m_downloadUrl;
    QString m_releaseNotes;
    QString m_md5Hash;
    QString m_fileSize;
    bool m_hasUpdateAvailable;
    
    // 語言相關
    QMenu* m_languageMenu;
    QString m_currentLanguage; // 跟蹤當前語言
    QAction* m_chineseSimplifiedAction;
    QAction* m_chineseTraditionalAction;
    QAction* m_englishAction;
    
    void createLanguageMenu();
    void loadLanguage(const QString& locale);
    QString getCurrentLanguage() const;
    void saveLanguageSetting(const QString& locale);
    void updateRecentFilesMenu();
    
    void updateActionTexts();
    void updateMenuTexts();
    
    
    QTranslator* m_translator;

    // 可配置 DPI 桶
    QVector<int> m_dpiBuckets;

    // 当前已加载文件的hash（避免在懒加载时从UI取不到）
    QString m_currentFileHash;
    
    // 输出设置

    // 处理设置（新增）
    ProcessingSettings m_processingSettings;

  
    // Extract Class重构：页面渲染器
    PageRenderer* m_pageRenderer;

    // 统一页面渲染器（新增）
    UnifiedPageRenderer* m_unifiedRenderer;

    // 统一拖拽处理器
    UnifiedDragDropHandler* m_dragDropHandler;

    // 缓存重建管理器（Martin Fowler重构）
    std::unique_ptr<CacheRebuildManager> m_cacheRebuildManager;

    // 边距更新优化定时器
    QTimer* m_marginUpdateTimer;
};

#endif // MAINWINDOW_H
